package common.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 对字符串加密,加密算法使用MD5、SHA-1、SHA-256
 * 
 * @author liuxj
 * @version 1.0.0 2014-4-22
 */
public class StringEncrypt {
    /** SHA-256加密算法 */
    private static final String SHA256_ENCRYPT = "SHA-256";

    /** SHA-1加密算法 */
    private static final String SHA1_ENCRYPT = "SHA-1";

    /** MD5加密算法 */
    private static final String MD5_ENCRYPT = "MD5";

    /**
     * 对字符串加密,加密算法使用SHA-256
     * 
     * @param str
     *            要加密的字符串
     * @return 加密后的字符串
     */
    public static String encryptBySha256(String str) {
        return encryptByType(str, SHA256_ENCRYPT);
    }

    /**
     * 对字符串加密,加密算法使用SHA-1
     * 
     * @param str
     *            要加密的字符串
     * @return 加密后的字符串
     */
    public static String encryptBySha1(String str) {
        return encryptByType(str, SHA1_ENCRYPT);
    }

    /**
     * 对字符串加密,加密算法使用MD5
     * 
     * @param str
     *            要加密的字符串
     * @return 加密后的字符串
     */
    public static String encryptByMd5(String str) {
        return encryptByType(str, MD5_ENCRYPT);
    }

    /**
     * 对字符串加密,加密算法使用MD5、SHA-1、SHA-256,默认使用SHA-256
     * 
     * @param str
     *            要加密的字符串
     * @param encryptType
     *            加密类型
     * @return 加密后的字符串
     */
    public static String encryptByType(String str, String encryptType) {
        MessageDigest md = null;

        if (encryptType == null || encryptType.equals("")) {
            encryptType = SHA256_ENCRYPT;
        }
        try {
            md = MessageDigest.getInstance(encryptType);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
        md.update(str.getBytes());

        return bytes2Hex(md.digest());
    }

    // to HexString
    private static String bytes2Hex(byte[] origBytes) {
        String tempStr = null;
        StringBuilder stb = new StringBuilder();
        for (int i = 0; i < origBytes.length; i++) {
            // ////System.out.println("and by bit: " + (origBytes[i] & 0xff));
            // ////System.out.println("no and: " + origBytes[i]);
            // ////System.out.println("---------------------------------------------");

            // 这里按位与是为了把字节转整时候取其正确的整数，java中一个int是4个字节
            // 如果origBytes[i]最高位为1，则转为int时，int的前三个字节都被1填充了
            tempStr = Integer.toHexString(origBytes[i] & 0xff);
            if (tempStr.length() == 1) {
                stb.append("0");
            }
            stb.append(tempStr);

        }
        return stb.toString();
    }

//    public static void main(String args[]) {
//        String s = StringEncrypt.encryptBySha256("字符串加密");
//        ////System.out.println(s);
//    }
}
